#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <X11/Xatom.h>
#include <stdio.h>
#include <stdlib.h>

#define DUMP_ERR printf

int main()
{
	Display *display;
	int screennum;
	int width;
	int height;
	const char *strdraw = "hello world" ;
	Window win;
	GC gc;
//打开显示 没有指明打开哪个显示时使用环境变量中的DESPLAY
	display = XOpenDisplay(NULL);
	if( !display ){
		DUMP_ERR("call XOpenDisplay(%s) fail\n",XDisplayName(NULL));
		return 1;
	}
//
////得到系统当前的屏幕 (如果使用虚拟屏幕的话 一般会有几个)
//// get default screen
	screennum = DefaultScreen(display);
////根据屏幕的大小决定窗口的大小
	width = DisplayWidth(display,screennum)/4;
	height = DisplayHeight(display,screennum)/4;
//
////创建窗口
//// create window
	win = XCreateSimpleWindow(display,RootWindow(display,screennum),0,0,width,height,3,BlackPixel(display,screennum),WhitePixel(display,screennum));
//
////选择窗口关心的事件
// select event
	XSelectInput(display,win,ExposureMask|KeyPressMask | ButtonPressMask | StructureNotifyMask);
//
////创建GC(图形上下文)
// 	create gc
	{
	unsigned long valuemask = 0;
	XGCValues values;
	gc = XCreateGC(display,win,valuemask,&values);
	}
//
//// 映射窗口 只有map后窗口才会在屏幕上显示
//// show window
	XMapWindow(display,win);
//
////进入事件循环
//// event loop

	while(1){
	XEvent event;
	XNextEvent(display,&event); // 读一个事件
	switch(event.type){
		case Expose: // expose window 显示事件
			if( event.xexpose.count != 0) 
				break;
			XDrawString(display,win,gc,10,10,strdraw,strlen(strdraw));
			break;
/// 按键事件
		case ButtonPress:
		case KeyPress:
			XFreeGC(display,gc);
//			XCloseWindow(win);
			XCloseDisplay(display);
			return 0;
		default:
			break;
	}//switch ends
	
	}//while
	
}
